package com.wbl.train.common.generator;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.TemplateType;
import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
import com.baomidou.mybatisplus.generator.fill.Column;
import com.baomidou.mybatisplus.generator.fill.Property;
import org.apache.ibatis.annotations.Mapper;

import java.sql.Types;
import java.util.Collections;

public class MyGeneratorConfig {
    public static void main(String[] args) {
        String url="jdbc:mysql://localhost:3306/train_business?serverTimezone=GMT%2B8&amp&useSSL=false&useUnicode=true&characterEncoding=utf-8&allowPublicKeyRetrieval=true";
        String username="train";
        String password="123456";

        //获取项目的根目录
        String rootDir = System.getProperty("user.dir");
        //maven项目下的java目录
        String javaDir = "\\src\\main\\java";
        //maven项目下的resources目录
        String resourcesDir = "\\src\\main\\resources";
        //指定输出目录
        String outDir = rootDir+"\\business"+javaDir;
        //父包名
        String parentPackage = "com.wbl.train.business";
        //生成xml的路径
        String xmlDir = outDir+parentPackage+resourcesDir+"\\mapper";
        //要生成的表名称
        String[] tableName={"sk_token"};
        //表前缀的过滤
        String[] tablePrefix={"acl_","edu_"};


//        System.getProperty("user.dir")+"\\edu-common-teacher"+"\\src\\main\\java"

        FastAutoGenerator.create(url,username,password)
                //全局配置
                .globalConfig(builder -> {
                    builder.author("王博纶") // 设置作者
                            .enableSpringdoc() // 开启 swagger 模式
                            .outputDir(outDir) // 指定输出目录
                            .disableOpenDir(); //禁止打开输出目录
                })
                //自定义类型转换器
                .dataSourceConfig(builder -> builder.typeConvertHandler((globalConfig, typeRegistry, metaInfo) -> {
                    int typeCode = metaInfo.getJdbcType().TYPE_CODE;
                    if (typeCode == Types.TINYINT) {
                        // 自定义类型转换
                        return DbColumnType.BOOLEAN;
                    }
                    return typeRegistry.getColumnType(metaInfo);

                }))
                //包配置
                .packageConfig(builder -> {
                    builder.parent(parentPackage) // 设置父包名
//                            .moduleName("system") // 设置父包模块名
                            .pathInfo(Collections.singletonMap(OutputFile.xml,xmlDir)); // 设置mapperXml生成路径
                })
                //策略配置
                .strategyConfig(builder -> {
                    builder.addInclude(tableName) // 设置需要生成的表名
                            .addTablePrefix(tablePrefix) // 设置过滤表前缀
                            //开启实体类的策略
                            .entityBuilder()
//                            .superClass(BaseEntity.class) //继承准备好的父类
//                            .addSuperEntityColumns("id","gmt_create","gmt_modified") //父类中的字段名
                            .disableSerialVersionUID() //禁用生成 serialVersionUID
                            .enableChainModel() //开启链式模型
                            .enableLombok() //开启 lombok 模型
                            .enableRemoveIsPrefix() //开启 Boolean 类型字段移除 is 前缀
                            .versionColumnName("version") //乐观锁字段名(数据库)
                            .logicDeleteColumnName("is_deleted") //逻辑删除字段名(数据库)
                            .addTableFills(new Column("gmt_create", FieldFill.INSERT)) //添加表字段填充
                            .addTableFills(new Property("gmt_modified", FieldFill.INSERT_UPDATE))
                            .idType(IdType.ASSIGN_ID) //全局主键类型---雪花ID
                            //开启mapper的策略
                            .mapperBuilder()
                            .mapperAnnotation(Mapper.class) //开启 @Mapper 注解
                            .enableBaseResultMap() //启用 BaseResultMap 生成
                            //开启service层的策略
                            .serviceBuilder()
                            .formatServiceFileName("%sService")  //转换 service 接口文件名称
                            //开启controller层的策略
                            .controllerBuilder()
                            .enableRestStyle(); // 开启生成@RestController 控制器
                })
                //模板配置
                .templateConfig(builder -> {
                    builder.disable(TemplateType.XML)
                            .entity("/templates/entity.java")
                            .controller("/templates/controller.java")
                            .mapper("/templates/mapper.java")
                            .service("/templates/service.java")
                            .serviceImpl("/templates/serviceImpl.java");
                })
                //执行方法
                .execute();
    }
}
